/*
 * Topic: 旅行商问题
 * Author: Yuanshun L
 * Written: 4-Nov-2021
 * Method: 动态规划法
 */
 
 /*
 有 8 个 城 市 C1 ， C2, …, C8, 它 们 的 坐 标 分 别 为
{41,94},{37,84},{54,67},{25,62},{7,64},{2,99},{68,58},{71,44}。从 C1 出发，请找到一条遍历这 8 个城市、
最终回到起点的最短走法及其总长度。两城市之间距离用直角坐标系中的两点距离公式

https://blog.csdn.net/qq_39559641/article/details/101209534
 
 */

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>

using namespace std;

const int maxn = 8+2;
const int maxm = 1 << (maxn-1) ;
const int INF = 10e7;

int x[maxn],y[maxn];
int g[maxn][maxn];
int visit[maxn];
int n = 0;

// 动态规划数组
int dp[maxn][maxm];


void builddp(){
    // 初始化
    for(int i=0;i<n;i++){
        dp[i][0] = g[i][0];
    }
    // 遍历所有可能的子集
    int m = (1<<(n-1))-1,temp;
    for(int i = 1;i<= m;i++){
        for(int j=0;j<n;j++){
            dp[j][i] = INF;
            // 子集中包含j，则不符合条件
            if(j>0 && ((i>>(j-1)) & 1)) continue;
            // 扫描集合里的所有点
            for(int k=1;k<n;k++){
                if((i>>(k-1) & 1) == 0)
                    continue;
                else{
                    temp = g[j][k] + dp[k][ i^(1<<(k-1))];
                    if(temp < dp[j][i])
                        dp[j][i] = temp;
                }
            }
        }
    }
}

vector<int> path;
void getPath(){
    int m = 1<<(n-1);
    int p = 0;
    int v =  m-1;
    path.push_back(0);

    while(v>0){
        int mp=0;
        for(int i=1;i<n;i++){
            if((v>>(i-1)&1) == 0) continue;
            if(dp[i][v ^ (1 << (i -1))] + g[p][i] == dp[p][v]){
                mp = i;
            }
        }
        path.push_back(mp);
        p = mp;
        v = v ^ (1 << (mp -1));
    }
    path.push_back(0);
}

// 打印最短回环路径和路径长度
void printPath(){
    int length=0;
    int a,b;
    int first = 0;
    for(int i=path.size()-1;i>=0;i--){
        if(i>0){
            a = path[i];
            b = path[i-1];
            length += sqrt(1.0 * g[a][b]);
        }
        if(first++) cout<<",";
        cout << "{"<< x[path[i]]<<","<< y[path[i]]<<"}";
    }
    cout<< endl;
    cout<< length << endl;
}


int main(){

    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);

    // read coordinations
    memset(visit,0,sizeof(visit));
    int a,b;
    while(cin>>a>>b){
        x[n] = a;
        y[n] = b;
        n++;
    }
    // build a graph
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            g[i][j] = g[j][i] = pow(x[i]-x[j],2) + pow(y[i]-y[j],2);
        }
    }
//    for(int i=0;i<n;i++){
//        for(int j=0;j<n;j++){
//            printf("%8d",g[i][j]);
//        }
//        cout<<endl;
//    }

    builddp();
    getPath();

//    for(int i=0;i<n;i++){
//        for(int j=0;j< (1<< (n-1));j++){
//            printf("%8d",dp[i][j]);
//        }
//        cout<<endl;
//    }

    printPath();

    return 0;
}